home *** CD-ROM | disk | FTP | other *** search
- * programme : SysInfo.s : delivre la charge du systeme, s'utilise
- * exclusivement sous le Shell (ou le CLI).
- * BUT: Avez vous remarquez que la commande "status" n'est capable de
- * délivrer que les noms des taches lancées a partir Shell. Tous les autres
- * programmes sont simplement escamotés. Cette limite m'a souvent fait
- * défaut. Donc, aprés m'etre inspiré du programme de la page 273 du RKM
- * "libraries & devices" (systeme 1.3) j'ai créé ce petit (800 octets)
- * pour non seulement afficher les taches mais aussi les librairies, les
- * devices et ressources.
- * Le programme s'utilise comme suit:
- * 1> SysInfo option <,option..)
- * avec option d : pour afficher la liste des DEVICES
- * l : pour les LIBRAIRIES
- * r : pour les RESSOURCES
- * t : pour les TACHES en ATTENTE (WAITING)
- * exemple : sysinfo dl ou sysinfo d l :affichera les devices et libraries.
-
- * L'ordre des argument peut etre quelconque, on peut mettre plusieurs
- * fois le même argument. Les d'arguments peuvent ou non etre separés par
- * un ou des blancs. Si l'on passe trop (plus de 8) arguments ou un ou plusieurs
- * arguments inconnus parmis des arguments connus, on obtiendra un message
- * de syntaxe.
- * PRINCIPE: On analyse le nb d'args passés puis leur valeur. On positionne une
- * valeur booléenne (table ArgValid) si un arg est reconnu. Ensuite on analyse
- * la tables des arguments valides et l'on va chercher les adresses des noms des
- * entités (device, libraries, resources & task) si besoins est. Les adresses
- * sont stockées sur la pile. A chaque valeur booléenne positionnée, on
- * introduira une entete et des caracteres de controle pour mettre un peu de
- * couleur a l'ecran. A la suite de ce travail, on se reserve de la memoire pour
- * constituer le fichier des noms (celui qui sera affiché).
- * Pour rechercher les noms, on doit interdire les interruptions (fonction
- * Enable).attention, les interruptions sont suspendues pendant 250µs seulement.
- * Ce temps doit etre exploiter au maximum. En 250µs, avec une machine
- * fonctionnant a 7MHz, on a environ 1750 coups d'horloge. Si on en laisse 250
- * au systeme il nous en reste 1500 (le calcul est fait avec un 68000)
- * Comme la boucle de recopie des adresses prend 16+12+4+10 = 42 coups d'horloge,
- * on pourra copier 1500/42 = 36 adresses donc autant de noms.
- * La taille du fichier des adresses est donc calculée comme suit :
- * 4*40*4 avec 4: car 4 listes possibles (d,l,r,t)
- * 40: 36+4 : nb d'adresses + entete
- * 4: car un adresse a besoin de 4 octets
- *BUGS: si l'on active l'option l, on ne trouve pas l'exec.library ?
- * Il y a 2 "," en trop par liste affichée (mais ce n'est pas genant.
-
- * fait sous Devpac2.15, Amiga 500, 512ko Chip et 512ko Fast.
- * Auteur : Tilagone Christophe, 2 rue Jean le Bail 87100 LIMOGES (FRANCE).
- * derniere modification : Mercredi 9 Septembre 1992
-
- opt o+,ow- ; optims maximales + warning
-
- incdir "Devpac2:include/"
- * incdir "rad:"
- include "libraries/dos_lib.i"
- include "exec/execbase.i"
- include "exec/nodes.i"
- include "exec/lists.i"
- include "exec/strings.i"
- include "exec/memory.i"
- include "exec/exec_lib.i"
- include "misc/easystart.i"
-
- DataSize equ 4*40*4 ; taille du fichier des adresses
- NameFileSize equ 4*40*25 ; taille du fichier des noms
-
- *================= Programme principal ==============================
- SaveArg move.l a0,ArgPtr ; sauver ptr sur arguments
- move.w d0,ArgNmbr ; sauver nb d'arguments passés
- MemAdr link a5,#-DataSize ; demander octets sur pile..
- move.l a5,OldA5 ; pour stocker les adresses des noms
-
- DOSLib lea DOSName(pc),a1
- CALLEXEC OldOpenLibrary ; ouvrir la dos.library
- move.l d0,_DOSBase ; et sauver son pointeur
- beq NoDOS ; pas de DOS ?
- StdOut CALLDOS Output ; chercher la Sortie Standard
- move.l d0,StdrOut ; et la sauver
-
- *================== Controle des arguments ==========================
- FindArg move.w ArgNmbr(pc),d0 ; charger le nombre d'args
- subq.w #(1+1),d0 ; calculer nb réel d'args + -1 pour DBF
- bmi Error ; pas d'argument passé
- cmpi.w #(2*4-1),d0 ; comparer a nb maxi d'argautorisé
- bpl Error ; si trop d'arguments passés: syntaxe
-
- Analyse movea.l ArgPtr(pc),a0 ; charger l'adresse des arguments
- loop1 cmpi.b #" ",(a0)+ ; rechercher les " " dans la chaine ..
- dbne d0,loop1 ; et les sauter
- lea ArgList(pc),a1 ; adresse de la liste des args valides
- moveq #(4-1),d1 ; nb d'arg valides
- loop2 move.b -1(a0),d2 ; charger UN arg passé..
- cmp.b (a1)+,d2 ; et le comparer a ceux de la liste..
- dbeq d1,loop2 ; jusqu'a le reconnaitre
- tst.w d1 ; si d1=-1 alors l'arg passé est <> de..
- bmi Error ; ceux connus donc : syntaxe
- move.b #$ff,(6-1)(a1) ; sinon positionner indicateur de validité
- NextArg dbf d0,loop1 ; il faut analyser tous les args
-
- *================== Recherche des adresses des noms =================
- TakeAdr lea ArgValid(pc),a0 ; charger table des arguments passés
- lea OffstLst(pc),a1 ; charger table des offsets
- movea.l _SysBase,a2 ; adresse d'Exec
- moveq #(4-1),d0 ; 4 "header" possibles
- loop3 tst.b (a0)+ ; tester validité arguments
- dbne d0,loop3 ; sauter les args non validés
- tst.w d0 ; si d0=-1 alors tous les args ont été
- bmi.s NameMem ; reconnus donc on va copier le noms
- moveq #(4-1),d1
- sub.l d0,d1 ; calculer l'offset de la table d'offsets
- lsl.l #1,d1 ; *2 car offsets sur .w
-
- move.l d1,d2 ; introduction de l'entete
- lsl.l #1,d2 ; d1*4=d2*2 car offset d'entete sur .l
- move.l #ColorOn,-(a5) ; passer en orange pour l'entete
- move.l 8(a1,d2.l),-(a5) ; adresse du nom de l'entete
- move.l #ColorOff,-(a5) ; passer en blanc
-
- move.w (a1,d1.l),d1 ; extraire l'offset de liste
- movea.l (a2,d1.l),a4 ; chercher le "header" de la liste ..
- movea.l LH_HEAD(a4),a4 ; et prendre le 1er node de la liste
- bsr CopyAdr ; puis recuperer tous les noms de la liste
- dbf d0,loop3 ; et boucler si necessaire
-
- *================== Copie des nom dans un fichier ===================
- NameMem move.l #NameFileSize,d0 ; taille mémoire maxi du fichier des noms
- move.l #(MEMF_CLEAR|MEMF_PUBLIC),d1
- CALLEXEC AllocMem ; allouer mémoire pour les noms
- move.l d0,FileAdr ; et sauver le pointeur sur le fichier
- beq NoDOS ; si d0=0 alors pas de ram ?
-
- movea.l d0,a0 ; adresse du fichier des noms
- movea.l OldA5(pc),a1 ; adresse de debut du fichier adresses
- moveq #-1,d3 ; compteur de char (pour Write)
- NextName movea.l -(a1),a2 ; charger l'adresse d'un nom
- .loop move.b (a2)+,(a0)+ ; copier un nom char a char
- beq.s EndName ; si char copier = 0, inserer séparateur
- cmpi.b #".",-1(a0) ; si char copier = ., inserer séparateur
- dbeq d3,.loop ; sinon compter le char copier & boucler
- EndName move.b #",",-1(a0) ; inserer un caractere de séparation
- cmpa.l a1,a5 ; faire toute la liste des adresses
- dbpl d3,NextName ; compter char séparateur & boucler
-
- move.b #CR,-(a0) ; inserer CR+LF pour replacer le curseur..
- move.b #LF,(a0)+ ; en debut de ligne
- move.b #LF,(a0) ; LF facultatif mais + esthetique
- subq.l #3,d3 ; ajouter 3 char au compteur (CR+2*LF)
- Affiche neg.l d3 ; d3 = nb de char dans le fichier
- move.l StdrOut(pc),d1 ; sortie standard dans d1
- move.l FileAdr(pc),d2 ; adresse du fichier des nom dans d2
- CALLDOS Write ; et afficher le fichier des noms
- bra.s Fin ; comme pas d'erreur, liberer ressources
-
- *================== Message de syntaxe ==============================
- Error move.l StdrOut(pc),d1
- move.l #SynTexte,d2
- move.l #(EndSyTxt-SynTexte),d3
- CALLDOS Write ; afficher syntaxe du prgm
- bra.s NoDOS
-
- *================== Libération des ressources =======================
- Fin movea.l FileAdr(pc),a1
- move.l #NameFileSize,d0 ; taille du fichier des noms
- CALLEXEC FreeMem
- NoDOS movea.l _DOSBase(pc),a1 ; fermer la DOS.library
- CALLEXEC CloseLibrary
- NoBuffer movea.l OldA5(pc),a5 ; liberer pile
- unlk a5
- NoMem moveq #0,d0 ; code de retour
- rts
-
- *================== CopyAdr =========================================
- * données mod : a3 : fichier des adresses.
- * a4 : pointeur sur la liste a traiter.
- * traitement : Copie les adresses des noms dans le fichier
- * geré par a3.
- CopyAdr CALLEXEC Forbid ; 250µs sans interruption
- .loop move.l LN_NAME(a4),-(a5) ; recopier l'adresse du nom
- movea.l LN_SUCC(a4),a4 ; chercher le nom suivant
- move.l a4,d3 ; car movea ne positionne pas les flags
- bne.s .loop ; boucler tant que SUCC <> 0
- CALLEXEC Permit ; rétablir les interruptions
- adda.l #4,a5 ; corriger pile (pour compenser LH_TAIL)
- rts ; et partir
-
- *================== Variables & Données =============================
- _DOSBase dc.l 0 ; pointeur sur la DOS
- StdrOut dc.l 0 ; sortie standard
- OldA5 dc.l 0 ; pour unliker
- FileAdr dc.l 0 ; adresee du fichier des noms
- DOSName dc.b "dos.library",0
- even
- ArgPtr dc.l 0 ; adresse des arguments passés au prgm
- ArgNmbr dc.w 0 ; nombre d' "
- ArgList dc.l "dlrt" ; liste des arguments connus
- dc.w 0
- ArgValid dc.w 0,0,0 ; indicateurs des arguments a traiter
- OffstLst dc.w DeviceList ; offsets des liste par rapport a ExecBase
- dc.w LibList
- dc.w ResourceList
- dc.w TaskWait
- Entetes dc.l HeadDevc,HeadLib,HeadRes,HeadWait
-
- SynTexte dc.b CR,LF,"SYSINFO: option <,option..>",CR,LF
- dc.b " Device, Librairie, Ressource, Tâche",CR,LF
- EndSyTxt
- even
- ColorOn dc.b CR,LF,$9B,"0;33;40m",0 ; passer en orange
- ColorOff dc.b BS,$9B,"0;31;40m",0 ; passer en blanc
- HeadDevc dc.b BS,"Devices :",0
- HeadLib dc.b BS,"Librairies:",0
- HeadRes dc.b BS,"Ressources:",0
- HeadWait dc.b BS,"Task Wait :",0
-
- END
-
-